const WebSocket = require('ws');
const http = require('http');
const express = require('express');
const path = require('path');

const app = express();
const server = http.createServer(app);

// 提供静态文件
app.use(express.static(path.join(__dirname, 'public')));

// 创建WebSocket服务器
const wss = new WebSocket.Server({ server });

// 存储所有连接的客户端和用户信息
const clients = new Map();
let userCount = 0;

// 随机颜色生成器
function getRandomColor() {
    const colors = [
        '#3498db', '#e74c3c', '#2ecc71', '#f39c12',
        '#9b59b6', '#1abc9c', '#d35400', '#c0392b'
    ];
    return colors[Math.floor(Math.random() * colors.length)];
}

// 发送用户列表给所有客户端
function broadcastUserList() {
    const onlineUsers = Array.from(clients.values());
    const userListMessage = JSON.stringify({
        type: 'user_list',
        users: onlineUsers,
        timestamp: new Date().toISOString()
    });

    broadcastToAll(userListMessage);
}

// 广播消息给所有客户端
function broadcastToAll(message) {
    clients.forEach((userInfo, client) => {
        if (client.readyState === WebSocket.OPEN) {
            client.send(message);
        }
    });
}

wss.on('connection', function connection(ws, req) {
    const userId = ++userCount;
    const userName = `用户${userId}`;
    const userInfo = {
        id: userId,
        name: userName,
        avatar: {
            color: getRandomColor(),
            letter: userName.charAt(0)
        },
        joinTime: new Date()
    };

    // 存储客户端连接
    clients.set(ws, userInfo);

    console.log(`用户 ${userInfo.name} 已连接，当前在线用户: ${clients.size}`);

    // 发送欢迎消息给新用户
    ws.send(JSON.stringify({
        type: 'system',
        message: '欢迎连接到聊天室!',
        timestamp: new Date().toISOString(),
        currentUser: userInfo
    }));

    // 广播新用户加入消息给所有客户端
    broadcastToAll(JSON.stringify({
        type: 'user_join',
        user: userInfo,
        message: `${userInfo.name} 加入了聊天室`,
        timestamp: new Date().toISOString(),
        onlineCount: clients.size
    }));

    // 广播更新后的用户列表给所有客户端
    broadcastUserList();

    // 处理收到的消息
    ws.on('message', function incoming(data) {
        try {
            const messageData = JSON.parse(data.toString());

            if (messageData.type === 'chat_message') {
                console.log(`收到来自 ${userInfo.name} 的消息: ${messageData.message}`);

                // 广播消息给所有客户端（包括发送者）
                broadcastToAll(JSON.stringify({
                    type: 'chat_message',
                    user: userInfo,
                    message: messageData.message,
                    timestamp: new Date().toISOString()
                }));
            }

        } catch (error) {
            console.error('消息解析错误:', error);
        }
    });

    // 处理连接关闭
    ws.on('close', function() {
        const user = clients.get(ws);
        clients.delete(ws);

        console.log(`用户 ${user.name} 已断开连接，当前在线用户: ${clients.size}`);

        // 广播用户离开消息
        broadcastToAll(JSON.stringify({
            type: 'user_leave',
            user: user,
            message: `${user.name} 离开了聊天室`,
            timestamp: new Date().toISOString(),
            onlineCount: clients.size
        }));

        // 广播更新后的用户列表
        broadcastUserList();
    });

    // 处理错误
    ws.on('error', function(error) {
        console.error('WebSocket错误:', error);
    });
});

// 启动服务器
const PORT = process.env.PORT || 8080;
server.listen(PORT, function() {
    console.log(`服务器运行在 http://localhost:${PORT}`);
    console.log(`WebSocket服务器运行在 ws://localhost:${PORT}`);
});
